home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PBLIB1 / SKEL / SKELGEN.PAS < prev    next >
Pascal/Delphi Source File  |  1994-05-03  |  9KB  |  336 lines

  1. Program SKELGen;
  2.  
  3. {$M 20000,0,50000}
  4.  
  5. uses PbMISC, PbDATA, PbOBJS, PbPARMS, PbDDL;
  6.  
  7. {
  8. Description:  Starting point for program to generate UNITs
  9.  
  10. Author      : Howard Richoux
  11. Date        :
  12. Last revised: 1.05  2/18/94
  13. Application : IBM PC and compatibles, done in Turbo Pascal 7.0
  14. Status      : Placed in the Public Domain by HNR Software 1/29/94
  15. Published in: none
  16.  
  17. Intended to be the starting point for future programs like DBPASGEN and BFILEGEN.
  18.  
  19. This is oriented to producing Units which are essentially OBJECTS with
  20.   the appropriate PASCAL shell around them.
  21.  
  22. }
  23.  
  24.  
  25.  
  26.  
  27. var OUTPUTname : string[40];  { file name for OUTPUT program }
  28. var INPUTname : string[40];   { file name for SOURCE data }
  29. var INPUText  : string[3];    { default file ext for SOURCE data }
  30. var root      : string[7];    { sort of a central identifier for fields, ... }
  31. var prefix    : string[1];    { like x or z --> "xNAME.pas" }
  32. var UsesStr   : string;       { slipped into the USES statement }
  33. var AncestorObject : string;  { the object this is derived from }
  34. var CurrentObject : string;   { THIS OBJECT }
  35. var FieldSpec     : string;   { useful "[fld1(s10,fld2(r10.2)]"  }
  36.  
  37. var OUTPT    : OUT_object_0; { Lines are output to FILE }
  38. var L        : STRA_object;  { Lines are output to FILE }
  39.  
  40. var flds      : DDL_object;   { hold list of fields/lengths (if needed) }
  41.  
  42.  
  43.  
  44.  
  45. { MAIN Code }
  46.  
  47.  
  48. Procedure MakePasFields;
  49. var i,j,len,decp : integer;
  50.     s, nam,typstr  : string;
  51.     typ     : char;
  52.      begin
  53.      for j := 1 to flds.count do
  54.           begin
  55.           nam  := flds.ddl[j].nam;
  56.           typ  := flds.ddl[j].typ;
  57.           len  := flds.ddl[j].len;
  58.           decp := flds.ddl[j].decp;
  59.           typstr := '';
  60.           case typ of
  61.              'I' : typstr := 'integer;';  {integer}
  62.              'L' : typstr := 'longint;';  {longint}
  63.              'R' : typstr := 'real;';     {real}
  64.              'C' : begin                  {char array}
  65.                    if len > 1 then
  66.                         typstr := 'array[1..'+integerstr(len,3)+'] of char;'
  67.                    else typstr := 'char;';
  68.                    end;
  69.              'S' : begin                  {PASCAL string}
  70.                    if len = 0 then len := 1;
  71.                    if len > 1 then
  72.                         typstr := 'string['+integerstr(len,3)+'];'
  73.                    else typstr := 'char;';
  74.                    end;
  75.               else begin      {unknown}
  76.                    typstr := '{Unknown field type ['+typ+']}';
  77.                    len := 0;
  78.                    end;
  79.               end;
  80.           L.append('          '+leftstr(nam,10)+': '+typstr);
  81.           end;
  82.      end;
  83.  
  84.  
  85. Procedure MakeUnitStart;
  86. var i, width   : integer;
  87.     rtype      : char;
  88.     tmp, tpe   : string[40];
  89.      begin
  90.      L.append('{SECTION ..'+prefix+Root+' }');
  91.      L.append(' ');
  92.      L.append('{ '+pProgID+' - hnr   '+FormatDTime+
  93.               ', Placed in the Public Domain by HNR Software 1/94 }');
  94.      L.append(' ');
  95.      L.append('Unit '+prefix+Root+';');
  96.      L.append(' ');
  97.      L.append('INTERFACE');
  98.      L.append(' ');
  99.      L.append('Uses miscstuf'+UsesStr+';');
  100.      L.append(' ');
  101.      end;
  102.  
  103.  
  104. Procedure MakeRecType;
  105. var i, width   : integer;
  106.     rtype      : char;
  107.     tmp, tpe   : string;
  108.      begin
  109.      if FieldSpec = '' then exit;
  110.      L.append('{SECTION .'+Root+'_record }');
  111.      L.append('type '+Root+'_record = record ');
  112.      MakePasFields;
  113.      L.append('          end;');
  114.      L.append(' ');
  115.      end;
  116.  
  117.  
  118. Procedure MakeObjectData;
  119.      begin
  120.      if fieldSpec = '' then exit;
  121.      L.append('         rec       : '+Root+'_record; ');
  122.      end;
  123.  
  124.  
  125. Procedure MakeObjectInitProc(hdr : boolean);
  126. var i, width   : integer;
  127.     rtype      : char;
  128.     tmp,tmp2,tpe    : string[20];
  129.      begin
  130.      if hdr then
  131.           begin
  132.           L.append('         Procedure  init     ( xyz : integer);');
  133.           end
  134.      else begin
  135.           L.append(' ');
  136.           L.append('Procedure  '+CurrentObject+'.init( xyz : integer);');
  137.           L.append('     begin');
  138.           L.append('     end;');
  139.           L.append(' ');
  140.           L.append(' ');
  141.           end;
  142.      end;
  143.  
  144.  
  145. Procedure MakeObjectDoneProc(hdr : boolean);
  146. var i, width   : integer;
  147.     rtype      : char;
  148.     tmp,tmp2,tpe    : string[20];
  149.      begin
  150.      if hdr then
  151.           begin
  152.           L.append('         Procedure  done;');
  153.           end
  154.      else begin
  155.           L.append(' ');
  156.           L.append('Procedure  '+CurrentObject+'.done;');
  157.           L.append('     begin');
  158.           L.append('     end;');
  159.           L.append(' ');
  160.           L.append(' ');
  161.           end;
  162.      end;
  163.  
  164.  
  165.  
  166. Procedure MakeObjectMethods(hdr : boolean);
  167. var i, width   : integer;
  168.     rtype      : char;
  169.     tmp,tmp2,tpe    : string[20];
  170.      begin
  171.      if hdr then
  172.           begin
  173.           L.append('         Procedure  Method1;');
  174.           end
  175.      else begin
  176.           L.append(' ');
  177.           L.append('Procedure  '+CurrentObject+'.Method1;');
  178.           L.append('     begin');
  179.           L.append('     end;');
  180.           L.append(' ');
  181.           L.append(' ');
  182.           end;
  183.      end;
  184.  
  185.  
  186.  
  187. Procedure MakeObjectProcs(hdr : boolean);
  188.      begin
  189.      MakeObjectInitProc(hdr);
  190.      MakeObjectMethods(hdr);
  191.      MakeObjectDoneProc(hdr);
  192.      end;
  193.  
  194.  
  195. Procedure MakeObjectHeader;
  196. var tmp   : string;
  197.      begin
  198.      L.append('{SECTION .'+Root+'_'+AncestorObject+' }');
  199.      L.append(' ');
  200.      tmp := 'OBJECT;';
  201.      if AncestorObject <> '' then tmp := 'OBJECT('+AncestorObject+')';
  202.      L.append('type  '+Root+'_'+AncestorObject+' = '+tmp);
  203.      MakeObjectData;
  204.      MakeObjectProcs(true);
  205.      L.append('         end;');
  206.      L.append(' ');
  207.      end;
  208.  
  209.  
  210. Procedure MakeImplementation;
  211.      begin
  212.      L.append(' ');
  213.      L.append('{SECTION .zImplementation }');
  214.      L.append('IMPLEMENTATION');
  215.      L.append(' ');
  216.      end;
  217.  
  218.  
  219. Procedure MakeUnitEnd;
  220.      begin
  221.      L.append(' ');
  222.      L.append('{SECTION zzInitialization }');
  223.      L.append('      begin { initialization }');
  224.      L.append('      end.');
  225.      end;
  226.  
  227.  
  228.  
  229. { ------------------------------------------------------------------- }
  230.  
  231. Procedure OUTSTRA(var L : STRA_object);
  232. var i : integer;
  233.     s : string;
  234.      begin
  235.      for i := 1 to L.count do
  236.           begin
  237.           s := L.fetchN(i);
  238.           OUTPT.OUT(s);
  239.           end;
  240.      end;
  241.  
  242.  
  243. Procedure MakePas;
  244. var outfname : string[40];
  245.      begin
  246.      L.init(500);
  247.      getdir(0,outfname);
  248.      outfname := addbackslash(outfname) + Prefix + Root;
  249.      forceext(outfname,'pas');
  250.      writeln('Writing to [',outfname,']');
  251.      OUTPT.LISTinit(outfname,OUT_typREWRITE);
  252.      OUTPT.LISTopen;
  253.  
  254.      MakeUnitStart;
  255.      MakeRecType;
  256.      MakeObjectHeader;
  257.      MakeImplementation;
  258.      MakeObjectProcs(false);
  259.      MakeUnitEnd;
  260.  
  261.      OUTSTRA(L);
  262.      OUTPT.done;
  263.      end;
  264.  
  265.  
  266. Procedure ProcessINPUTfile;
  267.      begin
  268.      if fieldSpec <> '' then
  269.           begin
  270.           flds.init;
  271.           FieldSpecToPbDDL(FieldSpec,flds);
  272.           flds.dump;
  273.           end;
  274.      end;
  275.  
  276.  
  277. Procedure DoSKELGen(OUTPUTname : string);
  278. var fn : string[40];
  279.      begin
  280.      fn := OUTPUTname;
  281.      writeln('fn ',fn);
  282.      writeln('root= ',Root);
  283.      ProcessINPUTfile;
  284.      MakePas;
  285.      end;
  286.  
  287.  
  288. Procedure SKELGenInit;
  289.      begin
  290.      OUTPUTname := 'testunit.pas';   {Unit file to be generated}
  291.  
  292.      addparm(1,'SOURCE','');
  293.      addparm(1,'SOURCEEXT','txt');
  294.      addparm(1,'FILE','');
  295.      addparm(1,'FIELDS','[fld1(s20),fld2(r10.2),fld3(i)]');
  296.      addparm(1,'ROOT','');
  297.      addparm(1,'PREFIX','z');
  298.      addparm(1,'ANCESTOR','UNKNOWN_object');
  299.      addparm(1,'USES','');
  300.  
  301.      StandardpVarsInit;
  302.  
  303.      prefix         := GetParmStr('PREFIX');
  304.      OUTPUTname     := GetParmStr('FILE');
  305.      INPUTname      := GetParmStr('SOURCE');
  306.      INPUText       := GetParmStr('SOURCEEXT');
  307.      UsesStr        := GetParmStr('USES');
  308.      AncestorObject := GetParmStr('ANCESTOR');
  309.  
  310.      Fieldspec      := GetParmStr('FIELDS');
  311.      Fieldspec      := UpCaseStr(FieldSpec);
  312.      trim(FieldSpec);
  313.      if FieldSpec[1] = '[' then RemoveEnds(FieldSpec);
  314.  
  315.      if paramcount > 0 then INPUTname := paramstr(1);
  316.  
  317.      root      := GetParmSTr('ROOT');
  318.      if root = '' then root := FileROOTStr(INPUTName);
  319.      root      := UpCaseStr(root);
  320.  
  321.      CurrentObject := Root + '_' + AncestorObject;
  322.      end;
  323.  
  324.  
  325.      begin
  326.      pProgID := 'SKELGen 1.05';
  327.      writeln(pProgID, ' - TEST code - HNR 2/94');
  328.      SKELGenInit;
  329.      if INPUTname <> '' then
  330.           begin
  331.           DoSKELGen(INPUTname);
  332.           end
  333.      else writeln('Without specifying a SOURCE= file, there is no point in this exercise');
  334.      writeln('');
  335.      end.
  336.